package com.itheima.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.bean.DishFlavor;
import com.itheima.bean.ShoppingCart;
import com.itheima.common.BaseContext;
import com.itheima.common.R;
import com.itheima.service.ShoppingCartService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@RequestMapping("/shoppingCart")
@RestController
public class ShoppingCartController {

    @Autowired
    private ShoppingCartService shoppingCartService;

    /**
     * 加入购物车
     * @param cart
     * @return
     */
    @PostMapping("/add")
    public R<String> add(@RequestBody ShoppingCart cart){
        //获取当前登录用户id
        Long userId = BaseContext.getCurrentId();

        //1.调用service处理
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
        //设置加入到当前登录用户的购物车中
        wrapper.eq(ShoppingCart::getUserId, userId);
        //1.1：判断加入到购物车的是菜品还是套餐
        Long dishId = cart.getDishId();
        if(dishId!=null){
            //加入的是菜品 设置口味信息
            wrapper.eq(ShoppingCart::getDishId,dishId);
            //判断菜品是否存在口味信息  如果存在，则设置口味信息进行筛选 如果不存在，则直接根据菜品id进行查询
            wrapper.eq(cart.getDishFlavor()!=null,ShoppingCart::getDishFlavor, cart.getDishFlavor());
        }else{
            //加入的是套餐
            wrapper.eq(ShoppingCart::getSetmealId,cart.getSetmealId());
        }

        //1.2：判断是第一次加入，还是购物车中已经存在 从而设置商品的数量
        ShoppingCart one = shoppingCartService.getOne(wrapper);
        if(one==null){
            //第一次加入
            one = cart;
            one.setUserId(userId);
            one.setNumber(1);
        }else{
            //购物车中已经存在 数量加一
            one.setNumber(one.getNumber()+1);
        }

        //1.3：将商品加入到购物车     //自动判断 如果id不为null，修改数量  id为null：新增
        shoppingCartService.saveOrUpdate(one);

        //2.响应处理结果
        return R.success("添加购物车成功！");
    }

    /**
     * 查看购物车
     * @return
     */
    @GetMapping("/list")
    public R<List<ShoppingCart>> list(){
        //1.调用service处理
        //1.1：设置查询条件 当前用户id
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(ShoppingCart::getUserId,BaseContext.getCurrentId());

        //2.调用list方法查询，得到List<ShoppingCart>
        List<ShoppingCart> list = shoppingCartService.list(wrapper);

        //2.响应处理结果
        return R.success(list);
    }

    /**
     * 商品数量减一
     * @param cart
     * @return
     */
    @PostMapping("/sub")
    public R<String> sub(@RequestBody ShoppingCart cart){
        //1.调用service处理
        //1.1：创建wrapper对象，设置查询条件
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();

        //1.2：设置当前登录用户id
        wrapper.eq(ShoppingCart::getUserId,BaseContext.getCurrentId());

        //1.3：设置查询条件  非null判断 为null不加条件   因为菜品和套餐时互斥的 如果减少的是菜品 那么setmealId一定为null 口味可有可无 如果减少的是套餐，则dishId一定为null
        wrapper.eq(cart.getDishId()!=null,ShoppingCart::getDishId,cart.getDishId());
        wrapper.eq(cart.getDishFlavor()!=null,ShoppingCart::getDishFlavor,cart.getDishFlavor());
        wrapper.eq(cart.getSetmealId()!=null,ShoppingCart::getSetmealId,cart.getSetmealId());

        //1.4：判断当前商品的数量 如果为1，则删除  如果大于1，则减一
        ShoppingCart one = shoppingCartService.getOne(wrapper);
        if(one.getNumber()>1){
            one.setNumber(one.getNumber()-1);
            shoppingCartService.updateById(one);
        }else{
            shoppingCartService.removeById(one.getId());
        }

        //2.响应处理结果
        return R.success("修改成功！");
    }

    /**
     * 清空购物车
     * @return
     */
    @DeleteMapping("/clean")
    public R<String> clean(){
        //1.调用service处理
        //1.1：设置删除条件  根据用户id删除他购物车中的数据
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(ShoppingCart::getUserId,BaseContext.getCurrentId());

        //1.2：执行删除操作  remove()
        shoppingCartService.remove(wrapper);

        //2.响应处理结果
        return R.success("清空成功！");
    }
}
